
#include<iostream>
#include<unistd.h>
#include<fstream>

#include"globalFile.h"
#include"Identity.h"
#include"Student.h"
#include"Teacher.h"
#include"Manager.h"


using namespace std;

void LoginIn(std::string fileName, int type);
void managerMenu(Identity* &manager);
void studentMenu(Identity * &student);
void teacherMenu(Identity * &teacher);

int main()
{
    cout << "======================  欢迎来到机房预约系统  =====================" 
         << endl;
	cout << endl << "请输入您的身份" << endl;
	cout << "\t\t -------------------------------\n";
	cout << "\t\t|                               |\n";
	cout << "\t\t|          1.学生代表           |\n";
	cout << "\t\t|                               |\n";
	cout << "\t\t|          2.老    师           |\n";
	cout << "\t\t|                               |\n";
	cout << "\t\t|          3.管 理 员           |\n";
	cout << "\t\t|                               |\n";
	cout << "\t\t|          0.退    出           |\n";
	cout << "\t\t|                               |\n";
	cout << "\t\t -------------------------------\n";
	cout << "输入您的选择: ";


    int select=0;
	cin>>select;

    switch (select)
    {
    case 1:
        LoginIn(STUDENT_FILE,1);
        break;
    
    case 2:
        LoginIn(TEACHER_FILE,2);
        break;
    
    case 3:
        LoginIn(ADMIN_FILE,3);
        break;
    
    case 4:
        /* 推出 */
        std::cout<<"谢谢您的使用，下次见\n";
        sleep(2);
        exit(0);

        break;
    
    default:
        break;
    }



    

	return 0;
    

}

/*
设定 学生的帐号是s开头
     老师的帐号是t开头
     管理员的帐号 admin m
*/

void LoginIn(std::string fileName, int type)
{
    Identity * person=nullptr;

    ifstream dataFile;
    
    dataFile.open(fileName,ios::in);

    if(! dataFile.is_open())
    {
        std::cout<<"文件不存在，请检查文件地址\n";
        dataFile.close();
        return;
    }
    
    std::string account;
    std::string name;
    std::string pwd;

    if (type==1) // 学生登入
    {
        std::cout<<"请输入您的学号\n";
        cin>>account;
    }
    else if (type==2) // 教师登入
    {
        std::cout<<"请输入您的职工号\n";
        std::cin>>account;
    }
    else if (type==3) // 管理员登入
    {
        std::cout<<"请输入您的管理员帐号\n";
        std::cin>>account;

    }

    std::cout<<"请输入密码\n";
    std::cin>>pwd;

    if (type==1) 
    {
        string F_account;
        string F_name;
        string F_pwd;

        // 是按照字符 char 读取 所以间隔每个空格读取一个数据
        while(dataFile>>F_account && dataFile >>F_name 
        && dataFile>>F_pwd)
        {
            if (account==F_account && pwd==F_pwd)
            {
                cout<<"学生验证登入成功！\n";
                sleep(1);

                // 清除命令行
                system("clear");

                person=new Student(F_account,F_name,F_pwd);
                studentMenu(person);

                return ;
            }
        }
        
    }
    else if (type==2) //教师验证登入
    {

        string F_account;
        string F_name;
        string F_pwd;

        while(dataFile>>F_account && dataFile >>F_name 
        && dataFile>>F_pwd)
        {
            if (account==F_account && pwd==F_pwd)
            {
                cout<<"教师验证登入成功！\n";
                sleep(1);

                system("clear");

                person=new Teacher(F_account,F_name,F_pwd);
                teacherMenu(person);
                return ;
            }
        }
        
    
    }
    else if (type==3) // 管理员登入验证
    {
        
        string F_account;
        string F_name;
        string F_pwd;

        while(dataFile>>F_account && dataFile >>F_name 
        && dataFile>>F_pwd)
        {
            if (account==F_account && pwd==F_pwd)
            {
                cout<<"管理员验证登入成功！\n";
                sleep(1);

                system("clear");
                // 创建管理员对象
                person=new Manager(F_account,F_name,F_pwd);
                // 二级菜单 管理员菜单
                managerMenu(person);
                return ;
            }
        }
    }

    std::cout<<"登入验证失败\n";
    sleep(2);
    exit(0);
}

// 指针类型转换本质上是指针对于类型的解释 这里的方法是 子类-> 基类-> 转回原先的子类 这样是不会发生错误的

void managerMenu(Identity * &manager)
{
    while(true)  //一直在循环 所以完成功能后会返回管理员菜单
    {
        // 管理员菜单的接口函数
        manager->openMenu();
        
        // 基类转子类 必须强制转换 因为编译器不保证正确性
        Manager * man=(Manager * )manager;

        int select=0;

        cin>>select;
        if(select == 1) // 添加帐号
        {
            cout<<"添加帐号\n";
            man->addAccount();
        }
        else if (select == 2) //查看账号
        {
            cout<<"查看账号\n";
            man->showPerson();

        }
        else if (select == 3) //查看机房
        {
            cout<<"查看机房\n";
            man->showComputer();

        }
        else if (select == 4) //清空预约
        {
            cout<<"清空预约\n";
            man->cleanFlie();
        }
        else if (select == 0) //注销登录
        {
            delete manager;
            cout<<"注销成功\n";
            system("clear");
            return ;
        }      
    }
}

// 学生菜单
void studentMenu(Identity * &student)
{
    while(true)
    {
        student->openMenu();

        Student* stu=(Student *)student;
        
        int select=0;
        cin>>select;

        // 申请预约
        if(select==1)
        {
            stu->applyReservation();

        }
        // 查看我的预约
        else if(select==2)
        {
            stu->showMyReservation();


        }
        // 查看所有预约
        else if(select==3)
        {
            stu->showAllReservation();
        }
        // 取消预约
        else if(select==4)
        {
            stu->cancelReservation();
            
        }
        // 注销登入
        else
        {
            delete student;
            cout<<"注销成功"<<endl;
            sleep(1);
            system("clear");
            return;

        }

    }

}

// 教师菜单
void teacherMenu(Identity * &teacher)
{
    while (true)
    {
        teacher->openMenu();

        Teacher* tea=(Teacher *) teacher;
        int select=0;

        cin>>select;
        
        if(select==1)
        {
            // 查看所有的预约
            tea->showAllReservation();
        }
        else if(select==2)
        {
            // 审核预约
            tea->validReservation();
        }
        else 
        {
            delete teacher;
            cout<<"注销成功"<<endl;
            sleep(1);
            system("clear");
        }
    }
    
}

